package br.com.lojapi.dao;

import br.com.lojapi.bean.Endereco;
import br.com.lojapi.bean.Fabricante;
import br.com.lojapi.bean.Fornecedor;
import br.com.lojapi.bean.Perfil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Beto
 */
public class FabricanteDAOImp implements FabricanteDAO {

    @Override
    public Object salvar(Object obj) throws Exception {
        PessoaDAO pessoaDAO = new PessoaDAOImp();
        PreparedStatement ps = null;
        Connection conn = null;
//ESTE MOTODO É USADO PRA SALVAR EM DUAS COLUNAS DO BANCO
        Fabricante fabricante = (Fabricante) pessoaDAO.salvar(obj);
        try {
            String SQL = "INSERT INTO fabricante (id, cnpj) "
                    + "VALUES(?, ?)";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, fabricante.getId());
            ps.setString(2, fabricante.getCnpj());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao salvar dados do Fabricante" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return fabricante;
    }

    @Override
    public void alterar(Object obj) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        PessoaDAO pessoaDAO = new PessoaDAOImp();
        pessoaDAO.alterar(obj);
        Fabricante fabricante = (Fabricante) obj;
        try {
            String SQL = "UPDATE fabricante SET cnpj=? WHERE id=?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, fabricante.getCnpj());
            ps.setInt(2, fabricante.getId());
            ps.executeUpdate();
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar atualizar dados" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public void excluir(int id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        try {
            String SQL = "DELETE FROM fabricante WHERE id = ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            ps.executeUpdate();
        } catch (Exception e) {
            System.out.println("Erro ao excluir Fabricante" + e.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
    }

    @Override
    public Object procurar(Integer id) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Fabricante fabricante = null;
        try {
            String SQL = "SELECT * FROM pessoa p "
                    + "join fabricante f on p.id = f.id join endereco e on e.idPessoa = p.id"
                    + " WHERE p.id = ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setInt(1, id);
            rs = ps.executeQuery();
            if (rs.next()) {
                fabricante = new Fabricante();
                Endereco endereco = new Endereco();
                fabricante.setEndereco(endereco);
                fabricante.setEndereco(new Endereco());
                fabricante.setId(rs.getInt("p.id"));
                fabricante.setNome(rs.getString("p.nome"));
                fabricante.setEmail(rs.getString("email"));
                fabricante.setTelefone(rs.getString("telefone"));
                fabricante.getEndereco().setId(rs.getInt("e.id"));
                fabricante.getEndereco().setRua(rs.getString("rua"));
                fabricante.getEndereco().setNumero(rs.getString("numero"));
                fabricante.getEndereco().setBairro(rs.getString("bairro"));
                fabricante.getEndereco().setCidade(rs.getString("cidade"));
                fabricante.getEndereco().setEstado(rs.getString("estado"));
                fabricante.getEndereco().setPais(rs.getString("pais"));
                fabricante.setCnpj(rs.getString("cnpj"));
            }
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar procurar fabricante" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return fabricante;
    }

    @Override
    public List<Object> listar() throws Exception {
//      listar apenas pra carregar a combo
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs;
        Fabricante fabricante;
        List fabricantes = new ArrayList();
        try {
            String SQL = "SELECT p.id, p.nome FROM pessoa p JOIN fabricante f ON p.id = f.id";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            rs = ps.executeQuery();
            while (rs.next()) {
                fabricante = new Fabricante();
                fabricante.setId(rs.getInt("p.id"));
                fabricante.setNome(rs.getString("nome"));
                fabricantes.add(fabricante);
          }
        } catch (SQLException se) {
            throw new Exception("Erro ao tentar listar dados de Categoria" + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps);
        }
        return fabricantes;
    }

    @Override
    public List pesquisaPorNome(String nome) throws Exception {
        PreparedStatement ps = null;
        Connection conn = null;
        ResultSet rs = null;
        Fabricante fabricante;
        Endereco endereco;
        List fornecedores = new ArrayList();
        try {
//            arrumar query
            String SQL = "SELECT * FROM pessoa p "
                    + "join fabricante f on p.id = f.id join endereco e on e.idPessoa = p.id"
                    + " WHERE p.nome LIKE ?";
            conn = FabricaConexao.getConnection();
            ps = conn.prepareStatement(SQL);
            ps.setString(1, "%" + nome + "%");
            rs = ps.executeQuery();
            while (rs.next()) {
                fabricante = new Fabricante();
                fabricante.setEndereco(new Endereco());
                fabricante.setId(rs.getInt("p.id"));
                fabricante.setNome(rs.getString("p.nome"));
                fabricante.setEmail(rs.getString("email"));
                fabricante.setTelefone(rs.getString("telefone"));
                fabricante.getEndereco().setId(rs.getInt("e.id"));
                fabricante.getEndereco().setRua(rs.getString("e.rua"));
                fabricante.getEndereco().setNumero(rs.getString("e.numero"));
                fabricante.getEndereco().setBairro(rs.getString("e.bairro"));
                fabricante.getEndereco().setCidade(rs.getString("e.cidade"));
                fabricante.getEndereco().setEstado(rs.getString("e.estado"));
                fabricante.getEndereco().setPais(rs.getString("e.pais"));
                fabricante.setCnpj(rs.getString("cnpj"));
                fornecedores.add(fabricante);
            }
        } catch (SQLException se) {
            throw new Exception("Erro pesquisar dados do fornecedor"
                    + se.getMessage());
        } finally {
            FabricaConexao.closeConnection(conn, ps, rs);
        }
        return fornecedores;
    }
}